﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;

namespace Model
{
    class Hilos
    {
        private Configuracion c { get; set; }
        private ColaPrioridad cola { get; set; }

        private Paciente[] atencion;
        private Paciente[] triage;
        private Paciente[] consultorios;

        private List<Paciente> espera = new List<Paciente>();

        private NodoColaPrioridad paciente;

        //24h = 86400 seg
        private int tiempo = 86400;

        public Hilos(Configuracion c, ColaPrioridad cola)
        {
            this.c = c;
            this.cola = cola;
            atencion = new Paciente[c.puntosAtencion];
            triage = new Paciente[c.consultoriosTriage];
            consultorios = new Paciente[c.consultoriosMedicos];
            paciente = cola.darPrimero();
        }

        public void simular()
        {
            
             
            /*tiempo de atención en puntos de atención: 3 minutos
            si es de prioridad 1 va directamente a consultorio médico 
            (el registro en punto de atencíon y triage se hacen en el mismo tiempo que es atendido)
             tiempo de atención en consultorios triage: 10 mins
             */
            int numPacientes = cola.numeroPacientes;

            while (paciente != null)
            {
                int i = 0;
                while (i < atencion.Length)
                {
                    if(atencion[i]==null)
                    {
                        atencion[i] = paciente.darPaciente();
                        paciente = paciente.darSiguiente();
                        i++;

                        Console.WriteLine("atencion "+ i+": "+ atencion[i].ToString());
                    }
                }

                tiempo -= 3;

                Thread t = new Thread(triageConsultas);
            }



        }

        public void triageConsultas()
        {
            int i = 0;

            while (i < atencion.Length)
            {
                for (int j = 0; j < triage.Length; j++)
                {
                    if (triage[j] != null)
                    {
                        if (atencion[i] != null)
                        {
                            triage[j] = atencion[i];
                            atencion[i] = null;
                            i++;
                        }
                    }
                    
                }

                if (i < atencion.Length)
                {
                    espera.Add(atencion[i]);
                    atencion[i] = null;
                    i++;
                }
            }

            tiempo -= 10;

            Thread t = new Thread(consultoriosAtencion);

            while (espera.Count > 0)
            {
                int x = 0;
                while (x < triage.Length)
                {
                    if (triage[x] == null)
                    {
                        if (espera.Count > 0)
                        {
                            triage[x] = espera.ElementAt(0);
                            espera.RemoveAt(0);
                            x++;
                        }
                        else
                        {
                            triageConsultas();
                        }
                    }
                }

                tiempo -= 10;

                Thread tr = new Thread(consultoriosAtencion);
            }
        }

        public void consultoriosAtencion()
        {
            int i = 0;
            while(i<triage.Length)
            {
                for (int j = 0; j < consultorios.Length; j++)
                {
                    if (consultorios[j] != null)
                    {
                        if (i < triage.Length)
                        {
                            if (triage[i] != null)
                            {
                                consultorios[j] = triage[i];
                                triage[i] = null;
                                i++;
                            }
                        }
                    }
                }
            }
        }
    }
}
